VS Codeのtext transformの実装
テキストのちょっとした変換(全小文字化など)をPythonでやっていたのですが、VS Codeでサクッとtransformできることを知りましたに少し書いた
VS Code Conference 2024発表準備の中で調べる
AbstractCaseAction
https://github.com/microsoft/vscode/blob/1.88.0/src/vs/editor/contrib/linesOperations/browser/linesOperations.ts#L1032
EditorActionを継承した抽象クラス
AbstractCaseActionに至る継承関係
public method
runを実装
EditOperation.replace(wordRangeまたはselection, this._modifyText(text, wordSeparators))
EditOperation
protected method
_modifyText
AbstractCaseActionを継承した具体クラスたち
_modifyTextを実装
JavaScriptの関数を使っている
UpperCaseAction
https://github.com/microsoft/vscode/blob/1.88.0/src/vs/editor/contrib/linesOperations/browser/linesOperations.ts#L1073
String.prototype.toLocaleUpperCase()
LowerCaseAction
https://github.com/microsoft/vscode/blob/1.88.0/src/vs/editor/contrib/linesOperations/browser/linesOperations.ts#L1088
String.prototype.toLocaleLowerCase()
正規表現を使っている!
TitleCaseAction
https://github.com/microsoft/vscode/blob/1.88.0/src/vs/editor/contrib/linesOperations/browser/linesOperations.ts#L1133
単語の先頭の文字を取り出す正規表現と思われる
小文字にしてから、単語の先頭の文字を取り出す
String.prototype.replace()で関数の引数が1つだけなので、正規表現に一致する文字列が渡る
キャプチャグループもあるが、関数で使われていない
gmuはフラグ(フラグ(JavaScript 正規表現))
'(^|[^\\p{L}\\p{N}\']|((^|\\P{L})\'))\\p{L}'(RegExpに渡すパターン)
Unicode 文字クラスエスケープ
\\となっているのはエスケープ。\として読める(\p, \P)
code:js
'(^)\\p{L}' // 行頭 /(^)\p{L}/gmu
'(^\\p{L}\\p{N}\')\\p{L}' // 文字集合 LでもNでもシングルクォートでもない
'(((^|\\P{L})\'))\\p{L}' // 行頭またはLでない の後に シングルクォート
code:javascript
'hello world'.match(new RegExp('(^)\\p{L}', 'gmu')) // "h"
'hello world'.match(new RegExp('(^\\p{L}\\p{N}\')\\p{L}', 'gmu')) // w"
'hello \'world'.match(new RegExp('(((^|\\P{L})\'))\\p{L}', 'gmu')) // 'w"
↑ String.prototype.match()とgフラグはキャプチャグループを返さない
SnakeCaseAction
https://github.com/microsoft/vscode/blob/1.88.0/src/vs/editor/contrib/linesOperations/browser/linesOperations.ts#L1158
_を追加するようにreplace
CamelCaseAction
https://github.com/microsoft/vscode/blob/1.88.0/src/vs/editor/contrib/linesOperations/browser/linesOperations.ts#L1187
全ての単語以外でword.substring(0, 1).toLocaleUpperCase()
lowerCamelCaseのようにする
PascalCaseAction
https://github.com/microsoft/vscode/blob/1.88.0/src/vs/editor/contrib/linesOperations/browser/linesOperations.ts#L1212
CamelCaseが全単語に適用される(先頭にも)
UpperCamelCaseのようにする
KebabCaseAction
https://github.com/microsoft/vscode/blob/1.88.0/src/vs/editor/contrib/linesOperations/browser/linesOperations.ts#L1241
-を追加するようにreplace
テスト https://github.com/microsoft/vscode/blob/1.88.1/src/vs/editor/contrib/linesOperations/test/browser/linesOperations.test.ts#L15
registerEditorActionされる
https://github.com/microsoft/vscode/blob/1.88.0/src/vs/editor/browser/editorExtensions.ts#L516
EditorContributionRegistryにregisterされている